package com.coffee.core;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 基本转换定义
 *
 * @author songkui
 * @date 2024/09/29
 */
public interface CoffeeConvert<BO, Entity, VO> {

    /**
     * 实体到视图对象
     *
     * @param entity 实体
     * @return {@link VO}
     */
    VO entityToVO(Entity entity);

    /**
     * 业务对象到实体
     *
     * @param bo 业务对象
     * @return {@link Entity}
     */
    Entity boToEntity(BO bo);

    /**
     * 从实体到视图对象
     *
     * @param list 列表
     * @return {@link List}<{@link VO}>
     */
    default List<VO> entityToVOList(List<Entity> list) {
        if (CollUtil.isEmpty(list)) {
            return Collections.emptyList();
        }
        return list.stream().map(this::entityToVO).collect(Collectors.toList());
    }

    /**
     * 业务对象到实体列表
     *
     * @param list 列表
     * @return {@link List}<{@link Entity}>
     */
    default List<Entity> boToEntityList(List<BO> list) {
        if (CollUtil.isEmpty(list)) {
            return Collections.emptyList();
        }
        return list.stream().map(this::boToEntity).collect(Collectors.toList());
    }

    /**
     * 分页
     *
     * @param page 列表
     * @return {@link List}>{@link VO}>
     */
    default CoffeePage<VO> entityToVOCoffeePage(CoffeePage<Entity> page) {
        if (null == page) {
            return null;
        }
        if (CollectionUtil.isEmpty(page.getRecords())){
            return CoffeePage.of(page.getTotal(), page.getSize(), page.getCurrent());
        }

        List<VO> list = entityToVOList(page.getRecords());
        return CoffeePage.of(list, page.getTotal(), page.getSize(), page.getCurrent());
    }


}
